<?php
class ManageNewsCategoriesController extends AppController {
	var $name = 'ManageNewsCategories';
	/**
	 @var $name
	 @brief Tên của controller
	 */
	
	/**
	 @var $uses
	 @brief Danh sách tất cả các model được sử dụng trong controller
	 */
	var $uses = array('news.NewsCategory');
	
	/**
	 @var $helpers
	 @brief Danh sách tất cả các Helper được sử dụng trong view
	 */
	var $helpers = array('Html','Form','Javascript', 'Wysiwyg');
	
	/**
	 @var $components
	 @brief Danh sách tất cả các Component được sử dụng trong controller
	 */
	var $components = array('MultiFileUpload');
	
	/**
	 @var $configs
	 @brief Tên của biến config
	 */
	var $configs = array();
	
	/**
	 @var $category_root_id
	 @brief Id của danh mục gốc của hệ thống quản lý trang
	 */
	var $category_root_id = null;
	
	/**
	 * Phương thức được sử dụng để thực hiện các xử lý trước khi bắt đầu 1 hành động
	 */
	
	function beforeFilter() {
		parent::beforeFilter();
		
		$this->configs = $this->NewsCategory->loadConfig();
		
		$this->category_root_id = $this->configs['Category']['root_id'];
		
		$this->set('configs', $this->configs);
	}
	

	/**
	 * Hành động liệt kê ra danh sách các danh mục, được tổ chức có cấu trúc cây, các xử lý xóa, sửa, di chuyển, v.v... có thể thực hiện trong khi liệt kê các danh mục
	 */
	function index() {
		$nodes = $this->NewsCategory->children($this->category_root_id, false);
		$tree = $this->NewsCategory->transformToTree($nodes);
		$this->set('tree', $tree);
		$tmp_array = array(
			$this->category_root_id	=>	__('Không thuộc danh mục nào', true)
		);
		
		$conditions = array();
		if ($this->category_root_id > 0) {
			$this->NewsCategory->Behaviors->attach('Containable');
			$this->NewsCategory->contain();
			$info = $this->NewsCategory->read(array('lft','rght'), $this->category_root_id);
			$conditions = array(
				"lft > ".$info['NewsCategory']['lft'],
				"rght < ".$info['NewsCategory']['rght'],
			);			
		}
		$parent_tree = $this->NewsCategory->generatetreelist($conditions, '{n}.NewsCategory.id', '{n}.NewsCategory.name', '--');
		
		
		
		$this->set('parent_tree', $tmp_array + $parent_tree);
	}
	
	/**
	 * Phương thức được sử dụng để tạo mới một danh mục, bao gồm hiển thị form nhập liệu và xử lý các thông tin nhập liệu đó
	 */
	function add() {
		if (empty($this->data)) {
			$tmp_array = array(
				$this->category_root_id	=>	__('Không thuộc danh mục nào', true)
			);
			
			$conditions = array();
			if ($this->category_root_id > 0) {
				$this->NewsCategory->Behaviors->attach('Containable');
				$this->NewsCategory->contain();
				
				// Load danh sách các category, tính từ root
				$info = $this->NewsCategory->read(array('lft','rght'), $this->category_root_id);
				$conditions = array(
					"lft > ".$info['NewsCategory']['lft'],
					"rght < ".$info['NewsCategory']['rght'],
				);			
			}
			$tree = $this->NewsCategory->generatetreelist($conditions, '{n}.NewsCategory.id', '{n}.NewsCategory.name', '--');
			$this->set('tree', $tmp_array + $tree);

			// load dữ liệu trong trường hợp phát sinh lỗi
			$this->__checkError('NewsCategory');
		} else {
			if (!isset($this->data['NewsCategory']['parent_id'])) {
				$this->data['NewsCategory']['parent_id'] = '';
			}
			
			if ($this->data['NewsCategory']['parent_id'] < 1) {
				$this->data['NewsCategory']['parent_id'] = $this->category_root_id;
			}

			try {
				// Create Category Information
				$this->data = $this->NewsCategory->validateData($this->data);
				
				// Xử lý với image
				$image = "";
				
				if (isset($this->configs['Category']['image']['show']) && $this->configs['Category']['image']['show']) {
					$this->MultiFileUpload->encode_filename = false;
					$this->MultiFileUpload->uploadpath = $this->configs['Category']['image']['path'];
					
					if (isset($this->configs['Category']['upload']) && isset($this->configs['Category']['upload']['AttachTypeAllowed'])) {
						$this->MultiFileUpload->_properties['AttachTypeAllowed'] = $this->configs['Category']['upload']['AttachTypeAllowed'];
					}
					
					$imgRet = array();
					try {
						$imgRet = $this->MultiFileUpload->upload();
					} catch (Exception $ex) {
						$this->Session->setFlash($ex->getMessage(), "flash_error");
						$this->redirect(array('action' => 'index'));
					}
					
					if (count($imgRet) > 0) {
						// assign name to image field.
						$this->data['NewsCategory']['image'] = $imgRet['image']['image'];
						App::import('Vendor','images/my_image'); 
						$thumbnail_dir = $this->configs['Category']['thumbnail']['path'];
						
						// Nếu chế độ là tự động resize, tiến hành resize
						$my_image = new my_image($this->MultiFileUpload->uploadpath.$imgRet['image']['image']);
						if (isset($this->configs['Category']['image']['autoResize']) && $this->configs['Category']['image']['autoResize']) {
							// resize image
							$my_image->thumbnail(
								$this->configs['Category']['image']['width'],
								$this->configs['Category']['image']['height'],
								$this->configs['Category']['image']['percent']
							);
							$my_image->copyTo($this->MultiFileUpload->uploadpath.$imgRet['image']['image']);
						}
						
						if ($this->configs['Category']['thumbnail']['thumbnail']) {
							if (!is_dir($thumbnail_dir)) {
								mkdir($thumbnail_dir);
							}
							
							$my_image->thumbnail(
								$this->configs['Category']['thumbnail']['width'],
								$this->configs['Category']['thumbnail']['height'],
								$this->configs['Category']['thumbnail']['percent']
							);
							
							$ext = strrchr($imgRet['image']['image'], ".");
							$pos = strrpos($imgRet['image']['image'], ".");
							$filename = substr($imgRet['image']['image'],0,$pos);
							$thumbnail_name = $filename."_thumbnail".$ext;
							$my_image->copyTo($thumbnail_dir.$thumbnail_name);
						}
						
						$image = $imgRet['image']['image'];
					}
				}
				
				$this->NewsCategory->create($this->data);
				if ($this->NewsCategory->save($this->data)) {
					$this->Session->setFlash(__("Danh mục tin đã được tạo thành công!", true), "flash_success");
					$this->redirect(array(
						'action'=>'index',
					));
				} else {
					// Delete uploaded image
					$this->NewsCategory->delete_image($image, $this->configs['Category']);
					$this->__setError('NewsCategory');
					$this->Session->setFlash(__("Không thể lưu thông tin danh mục tin. Bạn vui lòng thử lại", true), "flash_error");
					$this->redirect(array(
						'action'=>'add',
					));
				}
				
			} catch (Exception $ex) {
				$this->__setError('NewsCategory');
				$this->Session->setFlash($ex->getMessage(), "flash_error");
				$this->redirect(array(
					'action'	=>	'add'
				));
			}
		}
	}
	
	/**
	 * Phương thức được sử dụng để chỉnh sửa thông tin một danh mục, bao gồm hiển thị form nhập liệu và xử lý các thông tin nhập liệu đó
	 * @param $id ID của danh mục cần chỉnh sửa
	 */
	function edit($id=null) {
		if (empty($this->data)) {
			$this->data = $this->NewsCategory->read(null, $id);
			
			$tmp_array = array(
				$this->category_root_id	=>	__('Không thuộc danh mục nào', true)
			);
			
			$conditions = array();
			if ($this->category_root_id > 0) {
				$this->NewsCategory->Behaviors->attach('Containable');
				$this->NewsCategory->contain();
				$info = $this->NewsCategory->read(array('lft','rght'), $this->category_root_id);
				$conditions = array(
					"lft > ".$info['NewsCategory']['lft'],
					"rght < ".$info['NewsCategory']['rght'],
				);			
			}
			$tree = $this->NewsCategory->generatetreelist(
				array(
					'AND'	=>	array(
						"NewsCategory.id <> {$id}",
						'OR'	=>	array(
							"lft < ".$this->data['NewsCategory']['lft'],
							"rght > ".$this->data['NewsCategory']['rght']
						),
						$conditions
					)
				), 
				'{n}.NewsCategory.id', '{n}.NewsCategory.name', '--'
			);
			
			//debug($tree);exit;
			$this->NewsCategory->Behaviors->attach('Containable');
			$this->NewsCategory->contain();
			
			$this->set('tree', $tmp_array + $tree);
			
			// Load dữ liệu trong trường hợp phát sinh lỗi
			$this->__checkError('NewsCategory');
		} else {
			if ($this->data['NewsCategory']['parent_id'] < 1) {
				$this->data['NewsCategory']['parent_id'] = $this->category_root_id;
			}
			
			try {
				// Create Category Information
				$this->data = $this->NewsCategory->validateData($this->data);
				
				// Xử lý với image
				$image = "";
				$oldImage = "";
				if (isset($this->configs['Category']['image']['show']) && $this->configs['Category']['image']['show']) {
					$this->MultiFileUpload->encode_filename = false;
					$this->MultiFileUpload->uploadpath = $this->configs['Category']['image']['path'];
					if (isset($this->configs['Category']['upload']) && isset($this->configs['Category']['upload']['AttachTypeAllowed'])) {
						$this->MultiFileUpload->_properties['AttachTypeAllowed'] = $this->configs['Category']['upload']['AttachTypeAllowed'];
					}
					
					$imgRet = array();
					try {
						$imgRet = $this->MultiFileUpload->upload();
					} catch (Exception $ex) {
						$this->Session->setFlash($ex->getMessage(), "flash_error");
						$this->redirect(array('action' => 'index'));
					}
					
					
					if (count($imgRet) > 0) {
						// assign name to image field.
						$this->data['NewsCategory']['image'] = $imgRet['image']['image'];
						App::import('Vendor','images/my_image'); 
						$thumbnail_dir = $this->configs['Category']['thumbnail']['path'];
						
						// Nếu chế độ là tự động resize, tiến hành resize
						$my_image = new my_image($this->MultiFileUpload->uploadpath.$imgRet['image']['image']);
						if (isset($this->configs['Category']['image']['autoResize']) && $this->configs['Category']['image']['autoResize']) {
							// resize image
							$my_image->thumbnail(
								$this->configs['Category']['image']['width'],
								$this->configs['Category']['image']['height'],
								$this->configs['Category']['image']['percent']
							);
							$my_image->copyTo($this->MultiFileUpload->uploadpath.$imgRet['image']['image']);
						}
						
						if ($this->configs['Category']['thumbnail']['thumbnail']) {
							if (!is_dir($thumbnail_dir)) {
								mkdir($thumbnail_dir);
							}
							
							$my_image = new my_image($this->MultiFileUpload->uploadpath.$imgRet['image']['image']);
							$my_image->thumbnail(
								$this->configs['Category']['thumbnail']['width'],
								$this->configs['Category']['thumbnail']['height'],
								$this->configs['Category']['thumbnail']['percent']
							);
							
							$ext = strrchr($imgRet['image']['image'], ".");
							$pos = strrpos($imgRet['image']['image'], ".");
							$filename = substr($imgRet['image']['image'],0,$pos);
							$thumbnail_name = $filename."_thumbnail".$ext;
							$my_image->copyTo($thumbnail_dir.$thumbnail_name);
						}
						
						$image = $imgRet['image']['image'];
						
						// Get Old Image
						$oldImage = $this->NewsCategory->field('image');
					}
				}
				
				if ($this->NewsCategory->save($this->data)) {
					$this->Session->setFlash(__("Danh mục đã được cập nhật thành công!", true), "flash_success");
					
					// delete old image
					$this->NewsCategory->delete_image($oldImage, $this->configs['Category']);
					
					$this->redirect(array(
						'action'=>'index',
					));
				} else {
					// Delete uploaded image
					$this->NewsCategory->delete_image($image, $this->configs['Category']);
					
					$this->__setError('NewsCategory');
					$this->Session->setFlash(__("Không thể lưu thông tin danh mục. Bạn vui lòng thử lại", true), "flash_error");
					$this->redirect(array(
						'action'=>'edit',
						$id
					));
				}
				
			} catch (Exception $ex) {
				$this->__setError('NewsCategory');
				$this->Session->setFlash($ex->getMessage(), "flash_error");
				$this->redirect(array(
					'action'	=>	'edit',
					$id
				));
			}
		}
	}
	
	/**
	 * Phương thức được sử dụng để xóa 1 danh mục
	 * @param $id ID của danh mục cần xóa
	 * @return Không trả về dữ liệu, tự động chuyển về trang liệt kê
	 */
	function delete($id) {
		// Delete Image First
		try {
			$this->NewsCategory->deleteCategory($id, $this->configs['Category']);
			$this->Session->setFlash(__("Danh mục đã được xóa thành công!", true), "flash_success");
		} catch (Exception $ex) {
			$this->Session->setFlash(__("Không thể xóa thông tin danh mục. Bạn vui lòng thử lại", true), "flash_error");
		}
		
		$this->redirect(array(
			'action'	=>	'index'
		));
	}
	
	/**
	 * Phương thức được sử dụng để di chuyển một danh mục lên trên 1 bậc so với danh mục cùng cấp ngay trên nó trong cấu trúc cây
	 * @param $id ID của danh mục cần di chuyển
	 */
	function move_up($id) {
		$this->NewsCategory->moveup($id);
		$this->redirect(array(
			'action'	=>	'index',
		));
	}
	
	/**
	 * Phương thức được sử dụng để di chuyển một danh mục xuống dưới 1 bậc so với danh mục cùng cấp ngay dưới nó trong cấu trúc cây
	 *
	 * @param $id ID của danh mục cần di chuyển
	 */
	function move_down($id) {
		$this->NewsCategory->movedown($id);
		$this->redirect(array(
			'action'	=>	'index',
		));
	}
	

	/**
	 * Phương thức được sử dụng để xóa hình ảnh của 1 danh mục, bao gồm cả xóa thông tin dữ liệu và hình ảnh trên ổ cứng (kể cả thumbnail nếu có)
	 * @return unknown_type
	 */
	function delete_image() {
		if (isset($this->params['named']['category_id'])) {
			$id = intval($this->params['named']['category_id']);
			
			// Delete image in database
			$oldImage = $this->NewsCategory->deleteImage($id);
			
			// Delete image in hard-disk
			$this->NewsCategory->delete_image($oldImage, $this->configs['Category']);
			
			// redirect
			$this->Session->setFlash(__("Hình ảnh đã được xóa thành công!", true), "flash_success");
			$this->redirect(array('action'=>'edit', $id));
		} else {
			$this->Session->setFlash(__('Không đúng mã danh mục', true), "flash_error");
			$this->redirect(array('action'=>'index'));
		}
	}
}
?>